Polymorphic Data Structures এর জন্য Jackson ব্যবহার

Java Technologies - জ্যাকসন (Jackson) - Polymorphic Type Handling
204

Java-তে Polymorphic Data Structures মানে এমন ডেটা স্ট্রাকচার যা একাধিক টাইপের অবজেক্ট ধারণ করতে পারে। Jackson লাইব্রেরি এ ধরনের ডেটা Serialize এবং Deserialize করার জন্য সহজ পদ্ধতি সরবরাহ করে।

1. Polymorphic Serialization/Deserialization সমস্যা

যখন কোনো প্যারেন্ট ক্লাসের মাধ্যমে চাইল্ড ক্লাসগুলোকে হ্যান্ডল করতে হয়, তখন Serialize বা Deserialize করার সময় ক্লাসের সঠিক টাইপ নির্ধারণ করা জটিল হতে পারে।

Jackson এই সমস্যার সমাধান করে @JsonTypeInfo এবং @JsonSubTypes অ্যানোটেশন ব্যবহার করে।


2. উদাহরণ: Polymorphic Data Structure

ধরা যাক, আমাদের কাছে একটি Shape ইন্টারফেস বা প্যারেন্ট ক্লাস রয়েছে এবং তার দুইটি চাইল্ড ক্লাস Circle এবং Rectangle

প্যারেন্ট ও চাইল্ড ক্লাস তৈরি

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

// প্যারেন্ট ক্লাস বা ইন্টারফেস
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,      // টাইপের আইডেন্টিফায়ার হিসেবে টাইপের নাম ব্যবহার হবে
        include = JsonTypeInfo.As.PROPERTY,  // টাইপের তথ্য JSON-এর একটি প্রপার্টি হিসেবে যোগ হবে
        property = "type"                // টাইপের প্রপার্টির নাম
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Circle.class, name = "circle"),
        @JsonSubTypes.Type(value = Rectangle.class, name = "rectangle")
})
abstract class Shape {
    private String color;

    // Constructors, Getters, and Setters
    public Shape() {}

    public Shape(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Shape{color='" + color + "'}";
    }
}

// চাইল্ড ক্লাস ১: Circle
class Circle extends Shape {
    private double radius;

    public Circle() {}

    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    @Override
    public String toString() {
        return "Circle{" + "color='" + getColor() + '\'' + ", radius=" + radius + '}';
    }
}

// চাইল্ড ক্লাস ২: Rectangle
class Rectangle extends Shape {
    private double length;
    private double width;

    public Rectangle() {}

    public Rectangle(String color, double length, double width) {
        super(color);
        this.length = length;
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    @Override
    public String toString() {
        return "Rectangle{" + "color='" + getColor() + '\'' + ", length=" + length + ", width=" + width + '}';
    }
}

3. Serialization এবং Deserialization

Serialization: Polymorphic Object থেকে JSON

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.ArrayList;
import java.util.List;

public class PolymorphicSerializationExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Polymorphic objects তৈরি
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Circle("Red", 5.5));
        shapes.add(new Rectangle("Blue", 4.0, 6.0));

        // Serialize
        String json = mapper.writeValueAsString(shapes);
        System.out.println("Serialized JSON: " + json);
    }
}

আউটপুট:

[
  {
    "type": "circle",
    "color": "Red",
    "radius": 5.5
  },
  {
    "type": "rectangle",
    "color": "Blue",
    "length": 4.0,
    "width": 6.0
  }
]

Deserialization: JSON থেকে Polymorphic Object

public class PolymorphicDeserializationExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        String json = """
        [
          {
            "type": "circle",
            "color": "Red",
            "radius": 5.5
          },
          {
            "type": "rectangle",
            "color": "Blue",
            "length": 4.0,
            "width": 6.0
          }
        ]
        """;

        // Deserialize
        List<Shape> shapes = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, Shape.class));
        for (Shape shape : shapes) {
            System.out.println("Deserialized Shape: " + shape);
        }
    }
}

আউটপুট:

Deserialized Shape: Circle{color='Red', radius=5.5}
Deserialized Shape: Rectangle{color='Blue', length=4.0, width=6.0}

4. টিপস এবং গুরুত্বপূর্ণ বিষয়

  1. @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করুন:
    • @JsonTypeInfo JSON ডকুমেন্টে টাইপ সম্পর্কিত তথ্য যোগ করে।
    • @JsonSubTypes চাইল্ড টাইপগুলোর নাম ও ক্লাস ম্যাপিং করে।
  2. Type Identifier কাস্টমাইজেশন: যদি type প্রপার্টি না চান বা কাস্টম টাইপ ব্যবহার করতে চান, তা @JsonTypeInfo কনফিগার করে করা যায়।
  3. Interface বা Abstract Class: Shape যদি ইন্টারফেস হয়, তাহলেও একইভাবে কাজ করবে।
  4. Collection Handling: Collection টাইপের অবজেক্ট Serialize বা Deserialize করার সময় সঠিক টাইপ নিশ্চিত করতে হবে।

5. Use Cases

  • Inheritance Models: যখন একাধিক চাইল্ড ক্লাস প্যারেন্ট ক্লাসের মাধ্যমে এক্সপোজ করতে হয়।
  • API Development: REST API-তে ডায়নামিক ডেটা টাইপ হ্যান্ডল করতে।
  • Configuration Systems: কনফিগারেশন ফাইলের ডেটা বিভিন্ন সাবটাইপে বিভক্ত থাকলে।

Polymorphic Data Structure হ্যান্ডল করার জন্য Jackson একটি শক্তিশালী এবং সহজ সরঞ্জাম। @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করে JSON ডেটায় টাইপের তথ্য যোগ করা যায়, যা সহজেই Serialize এবং Deserialize করা সম্ভব।

আরও উদাহরণ বা নির্দিষ্ট কোনো সমস্যার সমাধান জানতে চাইলে জানাতে পারেন! 😊

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...